package demo01_basicGrammer

object Demo05_function_highLevel {

  /**
   * 高阶函数：以函数作为返回值或以函数作为参数的函数就是高阶函数
   */

  //1.定义一个最基础的函数
//  def processString(str:String):String = {
//    if(str!=null && !str.equals("")){
//      str.reverse
//    }else{
//      "error"
//    }
//  }

  //2.1 假设processString函数中处理字符串的逻辑非常复杂，这里需要对这个处理的内容进行封装
  //    假定此方法只应用于processString函数中，不再处理空字符串
//  def strReverser(str:String):String = {
//    str.reverse
//  }
  //2.2 处理字符串的逻辑单独封装，此函数中调用即可
//  def processString_reverse(str:String):String = {
//    if(str!=null && !str.equals("")){
//      strReverser(str)
//    }else{
//      "error"
//    }
//  }

  //2.3 一样的逻辑，但是处理字符串的方式不一样
//  def strReplacer(str:String):String = {
//    str.replace("o","^_^")
//  }
  //2.4 处理字符串的逻辑单独封装，此函数中调用即可
//  def processString_replace(str:String):String = {
//    if(str!=null && !str.equals("")){
//      strReplacer(str)
//    }else{
//      "error"
//    }
//  }


  //3.把需要随时更换的函数写活，所以这个函数可以做为参数，以函数作为参数的函数就是高阶函数
  def processString_all(str:String,fun:String=>String):String = {
    if(str!=null && !str.equals("")){
      fun(str)
    }else{
      "error"
    }
  }

  //定义一个高阶函数，实现两个数字的计算
  def calculator(x: Int, y: Int, calFun: (Int, Int) => Int): Int = {
    calFun(x, y)
  }

  def main(args: Array[String]): Unit = {
    /**
     * 通配符的使用条件
     *  1.定义了就得使用
     *  2.按顺序依次使用
     *  3.每个参数只能使用一次
     * 如果不符合以上条件，最简的形式就是匿名函数
     */
    //    println(processString_all("hello", _.replace("o","====")))

    println(calculator(10,20,_+_))
  }

}
